/**
* OpenKM, Open Document Management System (http://www.openkm.com)
* Copyright (c) 2006-2011 Paco Avila & Josep Llort
*
* No bytes were intentionally harmed during the development of this application.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.openkm.module.direct;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
//added by vissu on feb23 for zohoapi
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URL;
import java.net.URLEncoder;
import com.openkm.util.UUIDGenerator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Session;
import javax.jcr.version.VersionHistory;
import javax.jcr.version.VersionIterator;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.api.XASession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gwt.user.client.Window;
import com.openkm.bean.Document;
import com.openkm.bean.Lock;
import com.openkm.bean.Repository;
import com.openkm.bean.Version;
import com.openkm.bean.kea.MetadataDTO;
import com.openkm.bean.kea.Term;
import com.openkm.cache.UserItemsManager;
import com.openkm.core.AccessDeniedException;
import com.openkm.core.Config;
import com.openkm.core.DatabaseException;
import com.openkm.core.FileSizeExceededException;
import com.openkm.core.ItemExistsException;
import com.openkm.core.JcrSessionManager;
import com.openkm.core.LockException;
import com.openkm.core.PathNotFoundException;
import com.openkm.core.Ref;
import com.openkm.core.RepositoryException;
import com.openkm.core.UnsupportedMimeTypeException;
import com.openkm.core.UserQuotaExceededException;
import com.openkm.core.VersionException;
import com.openkm.core.VirusDetectedException;
import com.openkm.core.VirusDetection;
import com.openkm.dao.LockTokenDAO;
import com.openkm.dao.MimeTypeDAO;
import com.openkm.extension.core.DocumentExtensionManager;
import com.openkm.extension.core.ExtensionException;
import com.openkm.jcr.JCRUtils;
import com.openkm.kea.RDFREpository;
import com.openkm.kea.metadata.MetadataExtractionException;
import com.openkm.kea.metadata.MetadataExtractor;
import com.openkm.module.DocumentModule;
import com.openkm.module.base.BaseAuthModule;
import com.openkm.module.base.BaseDocumentModule;
import com.openkm.module.base.BaseNoteModule;
import com.openkm.module.base.BaseNotificationModule;
import com.openkm.module.base.BaseScriptingModule;
import com.openkm.principal.PrincipalAdapter;
import com.openkm.principal.PrincipalAdapterException;
import com.openkm.util.FileUtils;
import com.openkm.util.FormatUtil;
import com.openkm.util.Transaction;
import com.openkm.util.UserActivity;
//added by vissu on feb 20 for zohoapi
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.nio.charset.Charset;
import com.openkm.module.direct.InputStreamKnownSizeBody;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.HttpEntity;
import org.apache.http.util.EntityUtils;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.content.InputStreamBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
public class DirectDocumentModule implements DocumentModule {
private static Logger log = LoggerFactory.getLogger(DirectDocumentModule.class);
@Override
public Document create(String token, Document doc, InputStream is) throws UnsupportedMimeTypeException,
FileSizeExceededException, UserQuotaExceededException, VirusDetectedException,
ItemExistsException, PathNotFoundException, AccessDeniedException,
RepositoryException, IOException, DatabaseException, ExtensionException {
log.debug("create({}, {}, {})", new Object[] { token, doc, is });
return create(token, doc, is, null);
}
/**
* Used when importing mail with attachments
*/
public Document create(String token, Document doc, InputStream is, String userId) throws
UnsupportedMimeTypeException, FileSizeExceededException, UserQuotaExceededException,
VirusDetectedException, ItemExistsException, PathNotFoundException, AccessDeniedException,
RepositoryException, IOException, DatabaseException, ExtensionException {
log.debug("create({}, {}, {}, {})", new Object[] { token, doc, is, userId });
Document newDocument = null;
Node parentNode = null;
Session session = null;
int size = is.available();
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
if (size > Config.MAX_FILE_SIZE) {
log.error("Uploaded file size: {} ({}), Max file size: {} ({})", new Object[] {
FormatUtil.formatSize(size), size, FormatUtil.formatSize(Config.MAX_FILE_SIZE),
Config.MAX_FILE_SIZE });
throw new FileSizeExceededException(Integer.toString(size));
}
String parent = JCRUtils.getParent(doc.getPath());
String name = JCRUtils.getName(doc.getPath());
// Add to KEA - must have the same extension
int idx = name.lastIndexOf('.');
String fileExtension = idx>0 ? name.substring(idx) : ".tmp";
File tmp = File.createTempFile("okm", fileExtension);
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
// Escape dangerous chars in name
name = JCRUtils.escape(name);
doc.setPath(parent + "/" + name);
parentNode = session.getRootNode().getNode(parent.substring(1));
// Check file restrictions
String mimeType = Config.mimeTypes.getContentType(name.toLowerCase());
doc.setMimeType(mimeType);
if (Config.RESTRICT_FILE_MIME && MimeTypeDAO.findByName(mimeType) == null) {
throw new UnsupportedMimeTypeException(mimeType);
}
// Manage temporary files
byte[] buff = new byte[4*1024];
FileOutputStream fos = new FileOutputStream(tmp);
int read;
while ((read = is.read(buff)) != -1) {
fos.write(buff, 0, read);
}
fos.flush();
fos.close();
is.close();
is = new FileInputStream(tmp);
if (!Config.SYSTEM_ANTIVIR.equals("")) {
VirusDetection.detect(tmp);
}
// Start KEA
Collection<String> keywords = doc.getKeywords() != null ? doc.getKeywords() : new ArrayList<String>(); // Adding submitted keywords
if (!Config.KEA_MODEL_FILE.equals("")) {
MetadataExtractor mdExtractor = new MetadataExtractor(Config.KEA_AUTOMATIC_KEYWORD_EXTRACTION_NUMBER);
MetadataDTO mdDTO = mdExtractor.extract(tmp);
for (ListIterator<Term> it = mdDTO.getSubjectsAsTerms().listIterator(); it.hasNext();) {
Term term = it.next();
log.info("Term:" + term.getText());
if (Config.KEA_AUTOMATIC_KEYWORD_EXTRACTION_RESTRICTION) {
if (RDFREpository.getInstance().getKeywords().contains(term.getText())) {
keywords.add(term.getText().replace(" ", "_")); // Replacing spaces to "_" and adding at ends space for other word
}
} else {
keywords.add(term.getText().replace(" ", "_")); // Replacing spaces to "_" and adding at ends space for other word
}
}
}
// End KEA
// EP - PRE
Ref<Node> refParentNode = new Ref<Node>(parentNode);
Ref<File> refTmp = new Ref<File>(tmp);
Ref<Document> refDoc = new Ref<Document>(doc);
DocumentExtensionManager.getInstance().preCreate(session, refParentNode, refTmp, refDoc);
parentNode = refParentNode.get();
name = JCRUtils.escape(JCRUtils.getName(refDoc.get().getPath()));
mimeType = refDoc.get().getMimeType();
keywords = refDoc.get().getKeywords();
Node documentNode = BaseDocumentModule.create(session, parentNode, name, null /* doc.getTitle() */,
mimeType, keywords.toArray(new String[keywords.size()]), is);
// EP - POST
Ref<Node> refDocumentNode = new Ref<Node>(documentNode);
DocumentExtensionManager.getInstance().postCreate(session, refParentNode, refDocumentNode);
// Check document filters
// DocumentUtils.checkFilters(session, documentNode, mimeType);
// Set returned document properties
newDocument = BaseDocumentModule.getProperties(session, documentNode);
if (userId == null) {
// Check subscriptions
BaseNotificationModule.checkSubscriptions(documentNode, session.getUserID(), "CREATE_DOCUMENT", null);
// Check scripting
BaseScriptingModule.checkScripts(session, parentNode, documentNode, "CREATE_DOCUMENT");
// Activity log
UserActivity.log(session.getUserID(), "CREATE_DOCUMENT", documentNode.getUUID(), mimeType+", "+size+", "+doc.getPath());
} else {
// Check subscriptions
BaseNotificationModule.checkSubscriptions(documentNode, userId, "CREATE_MAIL_ATTACHMENT", null);
// Check scripting
BaseScriptingModule.checkScripts(session, parentNode, documentNode, "CREATE_MAIL_ATTACHMENT");
// Activity log
UserActivity.log(userId, "CREATE_MAIL_ATTACHMENT", documentNode.getUUID(), mimeType+", "+size+", "+doc.getPath());
}
} catch (javax.jcr.ItemExistsException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(parentNode);
throw new ItemExistsException(e.getMessage(), e);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(parentNode);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(parentNode);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(parentNode);
throw new RepositoryException(e.getMessage(), e);
} catch (java.io.IOException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(parentNode);
throw e;
} catch (MetadataExtractionException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(parentNode);
throw new RepositoryException(e.getMessage(), e);
} catch (VirusDetectedException e) {
JCRUtils.discardsPendingChanges(parentNode);
throw e;
} catch (DatabaseException e) {
JCRUtils.discardsPendingChanges(parentNode);
throw e;
} catch (ExtensionException e) {
JCRUtils.discardsPendingChanges(parentNode);
throw e;
} finally {
org.apache.commons.io.FileUtils.deleteQuietly(tmp);
if (token == null) JCRUtils.logout(session);
}
log.info("create: {}", newDocument);
return newDocument;
}
@Override
public void delete(String token, String docPath) throws AccessDeniedException, RepositoryException,
PathNotFoundException, LockException, DatabaseException {
log.debug("delete({}, {})", token, docPath);
Session session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
String name = JCRUtils.getName(docPath);
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
Node parentNode = documentNode.getParent();
Node userTrash = session.getRootNode().getNode(Repository.TRASH+"/"+session.getUserID());
if (documentNode.isLocked()) {
throw new LockException("Can't delete a locked node");
}
// Test if already exists a document whith the same name in the trash
String destPath = userTrash.getPath()+"/";
String testName = name;
String fileName = FileUtils.getFileName(name);
String fileExtension = FileUtils.getFileExtension(name);
for (int i=1; session.itemExists(destPath+testName); i++) {
testName = fileName+" ("+i+")."+fileExtension;
}
session.move(documentNode.getPath(), destPath+testName);
session.getRootNode().save();
// Check scripting
BaseScriptingModule.checkScripts(session, parentNode, documentNode, "DELETE_DOCUMENT");
// Activity log
UserActivity.log(session.getUserID(), "DELETE_DOCUMENT", documentNode.getUUID(), docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(session);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(session);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(session);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("delete: void");
}
@Override
public Document getProperties(String token, String docPath) throws RepositoryException,
PathNotFoundException, DatabaseException {
log.debug("getProperties({}, {})", token, docPath);
Document doc = null;
Session session = null;
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
//added by vissu on feb14
System.out.println("session.getUserID() = "+session.getUserID());
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
doc = BaseDocumentModule.getProperties(session, documentNode);
// Activity log
UserActivity.log(session.getUserID(), "GET_DOCUMENT_PROPERTIES", documentNode.getUUID(), doc.getKeywords().toString()+", "+docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("getProperties: {}", doc);
return doc;
}
@Override
public InputStream getContent(String token, String docPath, boolean checkout) throws
PathNotFoundException, RepositoryException, IOException, DatabaseException {
log.debug("getContent({}, {}, {})", new Object[] { token, docPath, checkout });
InputStream is;
Session session = null;
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
is = BaseDocumentModule.getContent(session, docPath, checkout);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} catch (IOException e) {
log.error(e.getMessage(), e);
throw e;
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("getContent: {}", is);
return is;
}
@Override
public InputStream getContentByVersion(String token, String docPath, String versionId) throws
RepositoryException, PathNotFoundException, IOException, DatabaseException {
log.debug("getContentByVersion({}, {}, {})", new Object[] { token, docPath, versionId });
InputStream is;
Session session = null;
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
Node contentNode = documentNode.getNode(Document.CONTENT);
VersionHistory vh = contentNode.getVersionHistory();
javax.jcr.version.Version ver = vh.getVersion(versionId);
Node frozenNode = ver.getNode(JcrConstants.JCR_FROZENNODE);
is = frozenNode.getProperty(JcrConstants.JCR_DATA).getStream();
// Activity log
UserActivity.log(session.getUserID(), "GET_DOCUMENT_CONTENT_BY_VERSION", documentNode.getUUID(), versionId+", "+is.available()+", "+docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("getContentByVersion: {}", is);
return is;
}
@Override
public void setContent(String token, String docPath, InputStream is) throws FileSizeExceededException,
UserQuotaExceededException, VirusDetectedException, VersionException, LockException,
PathNotFoundException, AccessDeniedException, RepositoryException, IOException,
DatabaseException {
log.debug("setContent({}, {}, {})", new Object[] { token, docPath, is });
Node contentNode = null;
Session session = null;
int size = is.available();
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
if (size > Config.MAX_FILE_SIZE) {
throw new FileSizeExceededException(""+size);
}
File tmpJcr = File.createTempFile("okm", ".jcr");
File tmpAvr = File.createTempFile("okm", ".avr");
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
// Manage temporary files
byte[] buff = new byte[4*1024];
FileOutputStream fosJcr = new FileOutputStream(tmpJcr);
FileOutputStream fosAvr = new FileOutputStream(tmpAvr);
int read;
while ((read = is.read(buff)) != -1) {
fosJcr.write(buff, 0, read);
if (!Config.SYSTEM_ANTIVIR.equals("")) fosAvr.write(buff, 0, read);
}
fosJcr.flush();
fosJcr.close();
fosAvr.flush();
fosAvr.close();
is.close();
is = new FileInputStream(tmpJcr);
if (!Config.SYSTEM_ANTIVIR.equals("")) {
VirusDetection.detect(tmpAvr);
}
JCRUtils.loadLockTokens(session);
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
BaseDocumentModule.setContent(session, documentNode, is);
// Check scripting
BaseScriptingModule.checkScripts(session, documentNode, documentNode, "SET_DOCUMENT_CONTENT");
// Activity log
UserActivity.log(session.getUserID(), "SET_DOCUMENT_CONTENT", documentNode.getUUID(), size+", "+docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(contentNode);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(contentNode);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.version.VersionException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(contentNode);
throw new VersionException(e.getMessage(), e);
} catch (javax.jcr.lock.LockException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(contentNode);
throw new LockException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(contentNode);
throw new RepositoryException(e.getMessage(), e);
} catch (java.io.IOException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(contentNode);
throw e;
} finally {
org.apache.commons.io.FileUtils.deleteQuietly(tmpJcr);
org.apache.commons.io.FileUtils.deleteQuietly(tmpAvr);
if (token == null) JCRUtils.logout(session);
}
log.debug("setContent: void");
}
@Override
public List<Document> getChilds(String token, String fldPath) throws PathNotFoundException,
RepositoryException, DatabaseException {
log.debug("getChilds({}, {})", token, fldPath);
List<Document> childs = new ArrayList<Document>();
Session session = null;
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node folderNode = session.getRootNode().getNode(fldPath.substring(1));
for (NodeIterator ni = folderNode.getNodes(); ni.hasNext(); ) {
Node child = ni.nextNode();
log.debug("Child: "+child.getPath()+", "+child.getPrimaryNodeType().getName());
if (child.isNodeType(Document.TYPE)) {
childs.add(BaseDocumentModule.getProperties(session, child));
}
}
// Activity log
UserActivity.log(session.getUserID(), "GET_CHILD_DOCUMENTS", folderNode.getUUID(), fldPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("getChilds: {}", childs);
return childs;
}
@Override
public Document rename(String token, String docPath, String newName) throws AccessDeniedException,
RepositoryException, PathNotFoundException, ItemExistsException, DatabaseException {
log.debug("rename:({}, {}, {})", new Object[] { token, docPath, newName });
Document renamedDocument = null;
Session session = null;
Node documentNode = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
String parent = JCRUtils.getParent(docPath);
String name = JCRUtils.getName(docPath);
// Escape dangerous chars in name
newName = JCRUtils.escape(newName);
if (newName != null && !newName.equals("") && !newName.equals(name)) {
String newPath = parent + "/" + newName;
session.move(docPath, newPath);
// Set new name
documentNode = session.getRootNode().getNode(newPath.substring(1));
documentNode.setProperty(Document.NAME, newName);
// Publish changes
session.save();
// Set returned document properties
renamedDocument = BaseDocumentModule.getProperties(session, documentNode);
} else {
// Don't change anything
documentNode = session.getRootNode().getNode(docPath.substring(1));
renamedDocument = BaseDocumentModule.getProperties(session, documentNode);
}
// Activity log
UserActivity.log(session.getUserID(), "RENAME_DOCUMENT", documentNode.getUUID(), newName+", "+docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(session);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.ItemExistsException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(session);
throw new ItemExistsException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(session);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(session);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("rename: {}", renamedDocument);
return renamedDocument;
}
@Override
public void setProperties(String token, Document doc) throws VersionException, LockException,
PathNotFoundException, AccessDeniedException, RepositoryException, DatabaseException {
log.debug("setProperties({}, {})", token, doc);
Node documentNode = null;
Session session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
documentNode = session.getRootNode().getNode(doc.getPath().substring(1));
// Update document keyword cache
//UserKeywordsManager.put(session.getUserID(), documentNode.getUUID(), doc.getKeywords());
// Update document title
// documentNode.setProperty(Document.TITLE, doc.getTitle() == null ? "" : doc.getTitle());
// Check subscriptions
BaseNotificationModule.checkSubscriptions(documentNode, session.getUserID(), "SET_DOCUMENT_PROPERTIES", null);
// Check scripting
BaseScriptingModule.checkScripts(session, documentNode, documentNode, "SET_DOCUMENT_PROPERTIES");
// Activity log
UserActivity.log(session.getUserID(), "SET_DOCUMENT_PROPERTIES", documentNode.getUUID(), doc.getPath());
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(documentNode);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(documentNode);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.version.VersionException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(documentNode);
throw new VersionException(e.getMessage(), e);
} catch (javax.jcr.lock.LockException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(documentNode);
throw new LockException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(documentNode);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("setProperties: void");
}
//added by vissu on feb20 for zohoapi
@Override
public String zoho(String token, String docPath) throws AccessDeniedException, RepositoryException,
PathNotFoundException, LockException, IOException,UnsupportedEncodingException, DatabaseException {
Document doc = this.getProperties(token, docPath);
String fileName = JCRUtils.getName(doc.getPath());
String url = null;
//condition for checking mimetypes which are supported by zoho export.writer server
if (doc.getMimeType().equals("application/msword") || doc.getMimeType().equals("application/vnd.oasis.opendocument.text") ||
doc.getMimeType().equals("application/vnd.openxmlformats-officedocument.wordprocessingml.document") ||
doc.getMimeType().equals("text/html") || doc.getMimeType().equals("application/rtf") || doc.getMimeType().equals("text/plain") || doc.getMimeType().equals("application/octet-stream"))
{
//adding zohoapi specifications by vissu
String apiKey = "70b914c8e9aa601130f2e04560316347";
String outputType = "editorurl";
String modeType = "normaledit";
//String fileName = "xyz.doc";
String username = "vissu67";
//String documentid = "7657668899";
String format = "doc";
String server = "export.writer";
String saveURL = "http://knowledgevault.com.au/zoho/saveurl.php";
String uid = doc.getUuid();
//String langType = "";
//String type = "";
//getting session token for zohoapi by vissu
JcrSessionManager sm = JcrSessionManager.getInstance();
System.out.println("sm.getTokens() = "+sm.getTokens().get(0));
//added by vissu for string encoding zohoapi
String zohostring = sm.getTokens().get(0)+"||"+docPath;
System.out.println("zohostring = "+zohostring);
String zohoencode = String.format("%x", new BigInteger(zohostring.getBytes("UTF-8")));
System.out.println("zohoencode="+zohoencode);
//checkout script for zohoapi by vissu
InputStream is = this.getContent(token, docPath, false);
this.checkout(sm.getTokens().get(0), docPath);
//declaring httpclient protocal for zohoapi by vissu
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost("https://exportwriter.zoho.com/remotedoc.im");
byte[] data = IOUtils.toByteArray(is);
//adding multipart content for zohoapi by vissu
MultipartEntity multipartContent = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartContent.addPart("apikey", new StringBody(apiKey));
multipartContent.addPart("output", new StringBody(outputType));
multipartContent.addPart("mode", new StringBody(modeType));
multipartContent.addPart("filename", new StringBody(fileName));
multipartContent.addPart("id", new StringBody(zohoencode));
multipartContent.addPart("username", new StringBody(username));
multipartContent.addPart("server", new StringBody(server));
multipartContent.addPart("format", new StringBody( format ));
multipartContent.addPart("saveurl", new StringBody(saveURL));
multipartContent.addPart("content", new InputStreamKnownSizeBody(new ByteArrayInputStream(data),data.length,doc.getMimeType(),fileName));
postRequest.setEntity(multipartContent);
//getting response from httpclient for zohoapi by vissu
HttpResponse res = httpClient.execute(postRequest);
HttpEntity resEntity = res.getEntity();
String line = EntityUtils.toString(resEntity);
System.out.println("PAGE :" + line);
//split the result string
String split[];
split = line.split("\n");
url=split[0].substring(4);
System.out.println("Result:"+url);
}
//if document mimetype is not supported by zoho export.writer server then...
else {
url="Not supported";
}
return url;
}
//end of zohoapi
@Override
public void checkout(String token, String docPath) throws AccessDeniedException, RepositoryException,
PathNotFoundException, LockException, DatabaseException {
log.debug("checkout({}, {})", token, docPath);
Transaction t = null;
XASession session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = (XASession) JCRUtils.getSession();
} else {
session = (XASession) JcrSessionManager.getInstance().get(token);
}
javax.jcr.lock.Lock lck = null;
t = new Transaction(session);
t.start();
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
Node contentNode = documentNode.getNode(Document.CONTENT);
lck = documentNode.lock(true, false);
JCRUtils.addLockToken(session, documentNode);
contentNode.checkout();
t.end();
t.commit();
// Check scripting
BaseScriptingModule.checkScripts(session, documentNode, documentNode, "CHECKOUT_DOCUMENT");
// Activity log
UserActivity.log(session.getUserID(), "CHECKOUT_DOCUMENT", documentNode.getUUID(), lck.getLockToken()+", "+docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
t.rollback();
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.lock.LockException e) {
log.error(e.getMessage(), e);
t.rollback();
throw new LockException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
t.rollback();
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
t.rollback();
throw new RepositoryException(e.getMessage(), e);
} catch (DatabaseException e) {
log.error(e.getMessage(), e);
t.rollback();
throw e;
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("checkout: void");
}
@Override
public void cancelCheckout(String token, String docPath) throws AccessDeniedException,
RepositoryException, PathNotFoundException, LockException, DatabaseException {
log.debug("cancelCheckout({}, {})", token, docPath);
Transaction t = null;
XASession session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
//added by vissu on feb24
JcrSessionManager sm = JcrSessionManager.getInstance();
token = sm.getTokens().get(0);
try {
if (token == null) {
session = (XASession) JCRUtils.getSession();
} else {
session = (XASession) JcrSessionManager.getInstance().get(token);
}
t = new Transaction(session);
t.start();
JCRUtils.loadLockTokens(session);
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
Node contentNode = documentNode.getNode(Document.CONTENT);
contentNode.restore(contentNode.getBaseVersion(), true);
documentNode.unlock();
JCRUtils.removeLockToken(session, documentNode);
t.end();
t.commit();
// Check subscriptions
BaseNotificationModule.checkSubscriptions(documentNode, session.getUserID(), "CANCEL_DOCUMENT_CHECKOUT", null);
// Check scripting
BaseScriptingModule.checkScripts(session, documentNode, documentNode, "CANCEL_DOCUMENT_CHECKOUT");
// Activity log
UserActivity.log(session.getUserID(), "CANCEL_DOCUMENT_CHECKOUT", documentNode.getUUID(), docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
t.rollback();
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.lock.LockException e) {
log.error(e.getMessage(), e);
t.rollback();
throw new LockException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
t.rollback();
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
t.rollback();
throw new RepositoryException(e.getMessage(), e);
} catch (DatabaseException e) {
log.error(e.getMessage(), e);
t.rollback();
throw e;
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("cancelCheckout: void");
}
@Override
public void forceCancelCheckout(String token, String docPath) throws AccessDeniedException,
RepositoryException, PathNotFoundException, LockException, DatabaseException,
PrincipalAdapterException {
log.debug("forceCancelCheckout({}, {})", token, docPath);
Transaction t = null;
XASession session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = (XASession) JCRUtils.getSession();
} else {
session = (XASession) JcrSessionManager.getInstance().get(token);
}
PrincipalAdapter pa = BaseAuthModule.getPrincipalAdapter();
List<String> userRoles = pa.getRolesByUser(session.getUserID());
/* commented below code by vissu oct 10
if (!userRoles.contains(Config.DEFAULT_ADMIN_ROLE)) {
throw new AccessDeniedException("Only administrator use allowed");
}*/
//added below code by vissu on oct 10th
if (!userRoles.contains(Config.DEFAULT_ADMIN_ROLE) && !userRoles.contains(Config.DEFAULT_GROUP_ADMIN_ROLE)) {
throw new AccessDeniedException("Only administrator use allowed");
}
t = new Transaction(session);
t.start();
JCRUtils.loadLockTokens(session);
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
Node contentNode = documentNode.getNode(Document.CONTENT);
javax.jcr.lock.Lock lock = documentNode.getLock();
if (lock.getLockOwner().equals(session.getUserID())) {
contentNode.restore(contentNode.getBaseVersion(), true);
documentNode.unlock();
JCRUtils.removeLockToken(session, documentNode);
} else {
String lt = JCRUtils.getLockToken(documentNode.getUUID());
session.addLockToken(lt);
contentNode.restore(contentNode.getBaseVersion(), true);
documentNode.unlock();
LockTokenDAO.remove(lock.getLockOwner(), lt);
}
t.end();
t.commit();
// Check subscriptions
BaseNotificationModule.checkSubscriptions(documentNode, session.getUserID(), "FORCE_CANCEL_DOCUMENT_CHECKOUT", null);
// Check scripting
BaseScriptingModule.checkScripts(session, documentNode, documentNode, "FORCE_CANCEL_DOCUMENT_CHECKOUT");
// Activity log
UserActivity.log(session.getUserID(), "FORCE_CANCEL_DOCUMENT_CHECKOUT", documentNode.getUUID(), docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
t.rollback();
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.lock.LockException e) {
log.error(e.getMessage(), e);
t.rollback();
throw new LockException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
t.rollback();
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
t.rollback();
throw new RepositoryException(e.getMessage(), e);
} catch (DatabaseException e) {
log.error(e.getMessage(), e);
t.rollback();
throw e;
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("forceCancelCheckout: void");
}
@Override
public boolean isCheckedOut(String token, String docPath) throws RepositoryException,
PathNotFoundException, DatabaseException {
log.debug("isCheckedOut({}, {})", token, docPath);
boolean checkedOut = false;
Session session = null;
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
Node contentNode = documentNode.getNode(Document.CONTENT);
checkedOut = contentNode.isCheckedOut();
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("isCheckedOut: {}", checkedOut);
return checkedOut;
}
//added by vissu on feb20
@Override
public Version checkin(String token, String docPath, String comment) throws AccessDeniedException,
RepositoryException, PathNotFoundException, LockException, VersionException, DatabaseException {
log.debug("checkin({}, {}, {})", new Object[] { token, docPath, comment });
Version version = new Version();
Transaction t = null;
XASession session = null;
//added by vissu
System.out.println("token = "+token);
System.out.println("docPath = " +docPath);
System.out.println("comment = "+comment);
JcrSessionManager sm = JcrSessionManager.getInstance();
System.out.println("sm.getSystemToken() = "+sm.getSystemToken());
System.out.println("sm.getTokens() = "+sm.getTokens());
System.out.println("sm.getTokens().get(0) = "+sm.getTokens().get(0));
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = (XASession) JCRUtils.getSession();
} else {
session = (XASession) JcrSessionManager.getInstance().get(token);
}
t = new Transaction(session);
t.start();
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
Node contentNode = null;
//added by vissu
System.out.println("docPath.substring(1) = "+docPath.substring(1));
System.out.println("documentNode = "+documentNode);
synchronized (documentNode) {
JCRUtils.loadLockTokens(session);
contentNode = documentNode.getNode(Document.CONTENT);
//added by vissu
System.out.println("Document.CONTENT = "+Document.CONTENT);
// Set version author
contentNode.setProperty(Document.AUTHOR, session.getUserID());
contentNode.setProperty(Document.VERSION_COMMENT, comment);
contentNode.save();
// Performs checkin & unlock
javax.jcr.version.Version ver = contentNode.checkin();
version.setAuthor(contentNode.getProperty(Document.AUTHOR).getString());
version.setSize(contentNode.getProperty(Document.SIZE).getLong());
version.setComment(contentNode.getProperty(Document.VERSION_COMMENT).getString());
version.setName(ver.getName());
version.setCreated(ver.getCreated());
version.setActual(true);
documentNode.unlock();
JCRUtils.removeLockToken(session, documentNode);
// Add comment (as system user)
String text = "New version " + ver.getName() + " by " + session.getUserID() + ": " + comment;
Session sysSession = JcrSessionManager.getInstance().getSystemSession();
BaseNoteModule.add(sysSession, documentNode, text);
}
t.end();
t.commit();
if (Config.USER_ITEM_CACHE) {
// Update user items
long size = contentNode.getProperty(Document.SIZE).getLong();
UserItemsManager.incSize(session.getUserID(), size);
}
// Remove pdf & preview from cache
BaseDocumentModule.cleanPreviewCache(documentNode.getUUID());
// Check subscriptions
BaseNotificationModule.checkSubscriptions(documentNode, session.getUserID(), "CHECKIN_DOCUMENT", comment);
// Check scripting
BaseScriptingModule.checkScripts(session, documentNode, documentNode, "CHECKIN_DOCUMENT");
// Activity log
UserActivity.log(session.getUserID(), "CHECKIN_DOCUMENT", documentNode.getUUID(), comment+", "+docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
t.rollback();
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.lock.LockException e) {
log.error(e.getMessage(), e);
t.rollback();
throw new LockException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
t.rollback();
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.version.VersionException e) {
log.error(e.getMessage(), e);
t.rollback();
throw new VersionException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
t.rollback();
throw new RepositoryException(e.getMessage(), e);
} catch (DatabaseException e) {
log.error(e.getMessage(), e);
t.rollback();
throw e;
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("checkin: {}", version);
return version;
}
@Override
public List<Version> getVersionHistory(String token, String docPath) throws PathNotFoundException,
RepositoryException, DatabaseException {
log.debug("getVersionHistory({}, {})", token, docPath);
List<Version> history = new ArrayList<Version>();
Session session = null;
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
Node contentNode = documentNode.getNode(Document.CONTENT);
VersionHistory vh = contentNode.getVersionHistory();
String baseVersion = contentNode.getBaseVersion().getName();
for (VersionIterator vi = vh.getAllVersions(); vi.hasNext(); ) {
javax.jcr.version.Version ver = vi.nextVersion();
String versionName = ver.getName();
// The rootVersion is not a "real" version node.
if (!versionName.equals(JcrConstants.JCR_ROOTVERSION)) {
Version version = new Version();
Node frozenNode = ver.getNode(JcrConstants.JCR_FROZENNODE);
version.setAuthor(frozenNode.getProperty(Document.AUTHOR).getString());
version.setSize(frozenNode.getProperty(Document.SIZE).getLong());
version.setComment(frozenNode.getProperty(Document.VERSION_COMMENT).getString());
version.setName(ver.getName());
version.setCreated(ver.getCreated());
if (versionName.equals(baseVersion)) {
version.setActual(true);
} else {
version.setActual(false);
}
history.add(version);
}
}
// Reverse history
Collections.reverse(history);
// Activity log
UserActivity.log(session.getUserID(), "GET_DOCUMENT_VERSION_HISTORY", documentNode.getUUID(), docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("getVersionHistory: {}", history);
return history;
}
@Override
public void lock(String token, String docPath) throws AccessDeniedException, RepositoryException,
PathNotFoundException, LockException, DatabaseException {
log.debug("lock({})", docPath);
Session session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
javax.jcr.lock.Lock lck = documentNode.lock(true, false);
JCRUtils.addLockToken(session, documentNode);
// Check subscriptions
BaseNotificationModule.checkSubscriptions(documentNode, session.getUserID(), "LOCK_DOCUMENT", null);
// Check scripting
BaseScriptingModule.checkScripts(session, documentNode, documentNode, "LOCK_DOCUMENT");
// Activity log
UserActivity.log(session.getUserID(), "LOCK_DOCUMENT", documentNode.getUUID(), lck.getLockToken()+", "+docPath);
} catch (javax.jcr.lock.LockException e) {
log.error(e.getMessage(), e);
throw new LockException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} catch (DatabaseException e) {
log.error(e.getMessage(), e);
throw e;
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("lock: void");
}
@Override
public void unlock(String token, String docPath) throws AccessDeniedException, RepositoryException,
PathNotFoundException, LockException, DatabaseException {
log.debug("unlock({}, {})", token, docPath);
Session session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
JCRUtils.loadLockTokens(session);
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
documentNode.unlock();
JCRUtils.removeLockToken(session, documentNode);
// Check subscriptions
BaseNotificationModule.checkSubscriptions(documentNode, session.getUserID(), "UNLOCK_DOCUMENT", null);
// Check scripting
BaseScriptingModule.checkScripts(session, documentNode, documentNode, "UNLOCK_DOCUMENT");
// Activity log
UserActivity.log(session.getUserID(), "UNLOCK_DOCUMENT", documentNode.getUUID(), docPath);
} catch (javax.jcr.lock.LockException e) {
log.error(e.getMessage(), e);
throw new LockException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} catch (DatabaseException e) {
log.error(e.getMessage(), e);
throw e;
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("unlock: void");
}
@Override
public void forceUnlock(String token, String docPath) throws LockException, PathNotFoundException,
AccessDeniedException, RepositoryException, DatabaseException, PrincipalAdapterException {
log.debug("forceUnlock({}, {})", token, docPath);
Session session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
PrincipalAdapter pa = BaseAuthModule.getPrincipalAdapter();
List<String> userRoles = pa.getRolesByUser(session.getUserID());
/* commented below code by vissu oct 10
if (!userRoles.contains(Config.DEFAULT_ADMIN_ROLE)) {
throw new AccessDeniedException("Only administrator use allowed");
}*/
//added below code by vissu on oct 10th
if (!userRoles.contains(Config.DEFAULT_ADMIN_ROLE) && !userRoles.contains(Config.DEFAULT_GROUP_ADMIN_ROLE)) {
throw new AccessDeniedException("Only administrator use allowed");
}
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
javax.jcr.lock.Lock lock = documentNode.getLock();
if (lock.getLockOwner().equals(session.getUserID())) {
JCRUtils.loadLockTokens(session);
documentNode.unlock();
JCRUtils.removeLockToken(session, documentNode);
} else {
String lt = JCRUtils.getLockToken(documentNode.getUUID());
session.addLockToken(lt);
documentNode.unlock();
LockTokenDAO.remove(lock.getLockOwner(), lt);
}
// Check subscriptions
BaseNotificationModule.checkSubscriptions(documentNode, session.getUserID(), "FORCE_UNLOCK", null);
// Check scripting
BaseScriptingModule.checkScripts(session, documentNode, documentNode, "FORCE_UNLOCK_DOCUMENT");
// Activity log
UserActivity.log(session.getUserID(), "FORCE_UNLOCK_DOCUMENT", documentNode.getUUID(), docPath);
} catch (javax.jcr.lock.LockException e) {
log.error(e.getMessage(), e);
throw new LockException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} catch (DatabaseException e) {
log.error(e.getMessage(), e);
throw e;
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("forceUnlock: void");
}
@Override
public boolean isLocked(String token, String docPath) throws RepositoryException, PathNotFoundException,
DatabaseException {
log.debug("isLocked({}, {})", token, docPath);
boolean locked;
Session session = null;
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
locked = documentNode.isLocked();
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("isLocked: {}", locked);
return locked;
}
@Override
public Lock getLock(String token, String docPath) throws RepositoryException, PathNotFoundException,
LockException, DatabaseException {
log.debug("getLock({}, {})", token, docPath);
Lock lock = new Lock();
Session session = null;
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
lock = BaseDocumentModule.getLock(session, docPath);
} catch (javax.jcr.lock.LockException e) {
log.error(e.getMessage(), e);
throw new LockException(e.getMessage(), e);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("getLock: {}", lock);
return lock;
}
@Override
public void purge(String token, String docPath) throws AccessDeniedException, RepositoryException,
PathNotFoundException, DatabaseException {
log.debug("purge({}, {})", token, docPath);
Node parentNode = null;
Session session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
String docUuid = documentNode.getUUID();
synchronized (documentNode) {
parentNode = documentNode.getParent();
BaseDocumentModule.purge(session, parentNode, documentNode);
}
// Check scripting
BaseScriptingModule.checkScripts(session, parentNode, documentNode, "PURGE_DOCUMENT");
// Activity log
UserActivity.log(session.getUserID(), "PURGE_DOCUMENT", docUuid, docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(parentNode);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(parentNode);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(parentNode);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("purge: void");
}
@Override
public void move(String token, String docPath, String dstPath) throws PathNotFoundException,
ItemExistsException, AccessDeniedException, RepositoryException, DatabaseException,
ExtensionException {
log.debug("move({}, {}, {})", new Object[] { token, docPath, dstPath });
Session session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
String name = JCRUtils.getName(docPath);
String dstNodePath = dstPath + "/" + name;
// EP - PRE
Node rootNode = session.getRootNode();
Node srcDocNode = rootNode.getNode(docPath.substring(1));
Node dstFldPath = rootNode.getNode(dstPath.substring(1));
Ref<Node> refSrcDocumentNode = new Ref<Node>(srcDocNode);
Ref<Node> refDstFolderNode = new Ref<Node>(dstFldPath);
DocumentExtensionManager.getInstance().preMove(session, refSrcDocumentNode, refDstFolderNode);
docPath = refSrcDocumentNode.get().getPath();
dstNodePath = refDstFolderNode.get().getPath() + "/" + name;
session.move(docPath, dstNodePath);
session.save();
// EP - POST
String srcDocParent = JCRUtils.getParent(docPath);
Node srcFldNode = rootNode.getNode(srcDocParent.substring(1));
Node dstDocNode = rootNode.getNode(dstNodePath.substring(1));
Ref<Node> refSrcFolderNode = new Ref<Node>(srcFldNode);
Ref<Node> refDstDocumentNode = new Ref<Node>(dstDocNode);
DocumentExtensionManager.getInstance().postMove(session, refSrcFolderNode, refDstDocumentNode);
// Check scripting
BaseScriptingModule.checkScripts(session, dstDocNode.getParent(), dstDocNode, "MOVE_DOCUMENT");
// Activity log
UserActivity.log(session.getUserID(), "MOVE_DOCUMENT", dstDocNode.getUUID(), docPath + ", " + dstPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(session);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.ItemExistsException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(session);
throw new ItemExistsException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(session);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(session);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("move: void");
}
@Override
public void copy(String token, String docPath, String dstPath) throws ItemExistsException,
PathNotFoundException, AccessDeniedException, RepositoryException, IOException, DatabaseException,
UserQuotaExceededException {
log.debug("copy({}, {}, {})", new Object[] { token, docPath, dstPath });
Node dstFolderNode = null;
Session session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node rootNode = session.getRootNode();
Node srcDocumentNode = rootNode.getNode(docPath.substring(1));
dstFolderNode = rootNode.getNode(dstPath.substring(1));
Node newDocument = BaseDocumentModule.copy(session, srcDocumentNode, dstFolderNode);
// Check subscriptions
BaseNotificationModule.checkSubscriptions(dstFolderNode, session.getUserID(), "COPY_DOCUMENT", null);
// Activity log
UserActivity.log(session.getUserID(), "COPY_DOCUMENT", newDocument.getUUID(), docPath + ", " + dstPath);
} catch (javax.jcr.ItemExistsException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(dstFolderNode);
throw new ItemExistsException(e.getMessage(), e);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(dstFolderNode);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(dstFolderNode);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(dstFolderNode);
throw new RepositoryException(e.getMessage(), e);
} catch (java.io.IOException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(dstFolderNode);
throw e;
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("copy: void");
}
@Override
public void restoreVersion(String token, String docPath, String versionId) throws AccessDeniedException,
RepositoryException, PathNotFoundException, DatabaseException {
log.debug("restoreVersion({}, {}, {})", new Object[] { token, docPath, versionId });
Node contentNode = null;
Session session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
synchronized (documentNode) {
contentNode = documentNode.getNode(Document.CONTENT);
contentNode.restore(versionId, true);
contentNode.save();
}
// Remove pdf & preview from cache
BaseDocumentModule.cleanPreviewCache(documentNode.getUUID());
// Activity log
UserActivity.log(session.getUserID(), "RESTORE_DOCUMENT_VERSION", documentNode.getUUID(), versionId+", "+docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(contentNode);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
JCRUtils.discardsPendingChanges(contentNode);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
JCRUtils.discardsPendingChanges(contentNode);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("restoreVersion: void");
}
@Override
public void purgeVersionHistory(String token, String docPath) throws AccessDeniedException,
RepositoryException, PathNotFoundException, DatabaseException {
log.debug("purgeVersionHistory({}, {})", token, docPath);
Session session = null;
if (Config.SYSTEM_READONLY) {
throw new AccessDeniedException("System is in read-only mode");
}
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
synchronized (documentNode) {
Node contentNode = documentNode.getNode(Document.CONTENT);
VersionHistory vh = contentNode.getVersionHistory();
String baseVersion = contentNode.getBaseVersion().getName();
for (VersionIterator vi = vh.getAllVersions(); vi.hasNext(); ) {
javax.jcr.version.Version ver = vi.nextVersion();
String versionName = ver.getName();
// The rootVersion is not a "real" version node.
if (!versionName.equals(JcrConstants.JCR_ROOTVERSION) && !versionName.equals(baseVersion)) {
vh.removeVersion(versionName);
}
}
}
// Activity log
UserActivity.log(session.getUserID(), "PURGE_DOCUMENT_VERSION_HISTORY", documentNode.getUUID(), docPath);
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("purgeVersionHistory: void");
}
@Override
public long getVersionHistorySize(String token, String docPath) throws RepositoryException,
PathNotFoundException, DatabaseException {
log.debug("getVersionHistorySize({}, {})", token, docPath);
long ret = 0;
Session session = null;
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node documentNode = session.getRootNode().getNode(docPath.substring(1));
Node contentNode = documentNode.getNode(Document.CONTENT);
VersionHistory vh = contentNode.getVersionHistory();
for (VersionIterator vi = vh.getAllVersions(); vi.hasNext(); ) {
javax.jcr.version.Version ver = vi.nextVersion();
String versionName = ver.getName();
// The rootVersion is not a "real" version node.
if (!versionName.equals(JcrConstants.JCR_ROOTVERSION)) {
Node frozenNode = ver.getNode(JcrConstants.JCR_FROZENNODE);
ret += frozenNode.getProperty(Document.SIZE).getLong();
}
}
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("getVersionHistorySize: {}", ret);
return ret;
}
@Override
public boolean isValid(String token, String docPath) throws PathNotFoundException, AccessDeniedException,
RepositoryException, DatabaseException {
log.debug("isValid({}, {})", token, docPath);
boolean valid = false;
Session session = null;
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node node = session.getRootNode().getNode(docPath.substring(1));
if (node.isNodeType(Document.TYPE)) {
valid = true;
}
} catch (javax.jcr.PathNotFoundException e) {
log.warn(e.getMessage(), e);
throw new PathNotFoundException(e.getMessage(), e);
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("isValid: {}", valid);
return valid;
}
@Override
public String getPath(String token, String uuid) throws AccessDeniedException, RepositoryException,
DatabaseException {
log.debug("getPath({}, {})", token, uuid);
String path = null;
Session session = null;
try {
if (token == null) {
session = JCRUtils.getSession();
} else {
session = JcrSessionManager.getInstance().get(token);
}
Node node = session.getNodeByUUID(uuid);
if (node.isNodeType(Document.TYPE)) {
path = node.getPath();
}
} catch (javax.jcr.AccessDeniedException e) {
log.warn(e.getMessage(), e);
throw new AccessDeniedException(e.getMessage(), e);
} catch (javax.jcr.RepositoryException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
} finally {
if (token == null) JCRUtils.logout(session);
}
log.debug("getPath: {}", path);
return path;
}
}